﻿''Creado por: Manuel Chaves el 13/6/10
''Esta clase sirve como un puente entre los objetos de tipo Nivel y la base de datos

Public Class MultiNivel
#Region "chaves"
    ''' <summary>
    ''' Registra un nivel en la base de datos
    ''' </summary>
    ''' <param name="p_codigoDepartamento">Codigo del Departamento</param>
    ''' <param name="p_nivel">Nivel</param>
    ''' <param name="p_salarioMaximo">Salario Maximo</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub crear(ByVal p_codigoDepartamento As Integer, ByVal p_nivel As Integer, _
               ByVal p_salarioMinimo As Double, ByVal p_salarioMaximo As Double)
        '
        Dim pars(3) As AccesoDatos.Parametro
        '
        Dim sql As String = "INSERT INTO t_nivel (codigo_departamento, nivel, salario_minimo, salario_maximo) VALUES (v_codigo_departamento, v_nivel, v_salario_minimo, v_salario_maximo)"
        pars(0) = New AccesoDatos.Parametro("v_codigo_departamento", p_codigoDepartamento)
        pars(1) = New AccesoDatos.Parametro("v_nivel", p_nivel)
        pars(2) = New AccesoDatos.Parametro("v_salario_minimo", p_salarioMinimo)
        pars(3) = New AccesoDatos.Parametro("v_salario_maximo", p_salarioMaximo)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox("MultiNivel -> crear : " + ex.Message)
            Throw ex
        End Try
    End Sub

    ''' <summary>
    ''' Llena los datos en los controles.
    ''' </summary>
    ''' <param name="p_codigo">Codigo del nivel</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtener(ByVal p_codigo As Integer) As Nivel
        Dim dr As IDataReader
        Dim pars(0) As AccesoDatos.Parametro
        Dim nivel As Nivel
        '
        Dim sql As String = "SELECT * FROM t_nivel WHERE codigo = p_codigo AND eliminado = 0"
        pars(0) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        '
        Try
            dr = g_access.ejecutarQuery(sql, pars)
            If dr.Read Then
                nivel = instanciarNivel(dr)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return nivel
    End Function

    ''' <summary>
    ''' Actualiza los datos de un nuvel.
    ''' </summary>
    ''' <param name="p_codigo">Codigo</param>
    ''' <param name="p_salarioMaximo">Salario Maximo</param>
    ''' <param name="p_salarioMinimo">Salario Minimo</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub actualizar(ByVal p_codigo As Integer, ByVal p_salarioMinimo As Double, ByVal p_salarioMaximo As Double)
        Dim pars(2) As AccesoDatos.Parametro
        Dim sql As String
        '
        sql = "UPDATE t_nivel SET salario_minimo = p_salario_minimo, salario_maximo = p_salario_maximo WHERE codigo = p_codigo"
        '
        pars(0) = New AccesoDatos.Parametro("p_salario_minimo", p_salarioMinimo)
        pars(1) = New AccesoDatos.Parametro("p_salario_maximo", p_salarioMaximo)
        pars(2) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Actualiza el campo "nivel" en el registro de un nivel.
    ''' </summary>
    ''' <param name="p_codigo">Codigo del nivel</param>
    ''' <param name="p_nivel">Nuevo nivel</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub actualizarNivel(ByVal p_codigo As Integer, ByVal p_nivel As Integer)
        Dim pars(2) As AccesoDatos.Parametro
        Dim sql As String
        '
        sql = "UPDATE t_nivel SET nivel = p_nivel WHERE codigo = p_codigo"
        '
        pars(0) = New AccesoDatos.Parametro("p_nivel", p_nivel)
        pars(1) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Llena los datos en los controles.
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Private Shared Function instanciarNivel(ByVal p_dr As IDataReader) As Nivel
        '
        Dim codigo As Integer = p_dr.Item("codigo")
        Dim codigoDepartamento As Integer = p_dr.Item("codigo_departamento")
        Dim nivel As Integer = p_dr.Item("nivel")
        Dim salarioMinimo As Double = p_dr.Item("salario_minimo")
        Dim salarioMaximo As Double = p_dr.Item("salario_maximo")
        '
        Dim objNivel = New Nivel(codigo, codigoDepartamento, nivel, salarioMinimo, salarioMaximo)
        Return objNivel
    End Function

    ''' <summary>
    ''' Lista los niveles por departamento.
    ''' </summary>
    ''' <param name="p_codigoDepartamento">Codigo del dept</param>
    ''' <returns>Una lista con los depts.</returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function listarPorDepartamento(ByVal p_codigoDepartamento As Integer) As List(Of Nivel)
        Dim dr As IDataReader
        Dim pars(0) As AccesoDatos.Parametro
        Dim nivel As Nivel
        Dim listaNiveles As New List(Of Nivel)
        '
        Dim sql As String = "SELECT * FROM t_nivel WHERE codigo_departamento = p_codigo_departamento AND eliminado = 0 order by nivel"
        pars(0) = New AccesoDatos.Parametro("p_codigo_departamento", p_codigoDepartamento)
        '
        Try
            dr = g_access.ejecutarQuery(sql, pars)
            While dr.Read
                nivel = instanciarNivel(dr)
                listaNiveles.Add(nivel)
            End While
            '
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return listaNiveles
    End Function

    ''' <summary>
    ''' Elimina un nivel de la base de datos
    ''' </summary>
    ''' <param name="p_codigo">Codigo del nivel</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub eliminar(ByVal p_codigo)
        '
        acomodarPuestos(p_codigo)
        '
        Dim objNivel As Nivel
        objNivel = obtener(p_codigo)
        Dim dept = objNivel.codigoDepartamento
        Dim nivel = objNivel.nivel
        Dim pars(0) As AccesoDatos.Parametro
        '
        Dim sql As String = "UPDATE t_nivel SET eliminado = 1 WHERE codigo = p_codigo"
        pars(0) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        '
        acomodarNiveles(dept, nivel)
        ''
    End Sub

    ''' <summary>
    ''' Arregla el orden de los niveles restando cuando es necesario.
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Private Shared Sub acomodarNiveles(ByVal p_codigoDepartamento As Integer, ByVal p_nivel As Integer)
        Dim pars(1) As AccesoDatos.Parametro
        Dim sql As String = "UPDATE t_nivel SET nivel = (nivel - 1) WHERE codigo_departamento = p_codigo_departamento AND nivel > p_nivel AND eliminado = 0"
        pars(0) = New AccesoDatos.Parametro("p_codigo_departamento", p_codigoDepartamento)
        pars(1) = New AccesoDatos.Parametro("p_nivel", p_nivel)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Pone null al nivel.
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub acomodarPuestos(ByVal p_codigo)
        Dim pars(0) As AccesoDatos.Parametro
        Dim sql As String = "UPDATE t_puesto SET eliminado = 1 WHERE codigo_nivel = p_codigo"
        pars(0) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        '
        Try
            g_access.ejecutarSQL(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Shared Function revisarEliminado(ByVal p_codigo) As Integer
        Dim sql = "SELECT eliminado FROM t_nivel where codigo = p_codigo"
        Dim dr As IDataReader
        Dim pars(0) As AccesoDatos.Parametro
        pars(0) = New AccesoDatos.Parametro("p_codigo", p_codigo)
        Dim elim As Boolean
        elim = 0
        Try
            dr = g_access.ejecutarQuery(sql, pars)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        If dr.Read Then
            elim = dr.Item("eliminado")
        End If
        Return elim
    End Function
#End Region
End Class

